# Python 正则表达式
'''
什么是正则表达式
re 标准库
代表字符
代表数量
代表边界
代表分组
贪婪模式与非贪婪模式
re 标准库其它方法
标志位
'''

# 正则表达式
'''
正则表达式是对字符串操作得一种逻辑方式，就是用实现定义好得一些特定字符及这些特定字符得组合，组成一个规则字符串，
这个规则字符串就是表达对字符串得逻辑，给定一个正则表达式和另一个字符串，通过正则表达式从字符串提取我们想要的部分。
'''

# re标准库 (Python正则表达式主要由re标准库提供，拥有了基本所有的表达式。)
'''
方法                                            描述
re.compile(pattern,flags=0)                    把正则表达式编译成一个对象
re.match(pattern,string,flags=0)               匹配字符串开始，如果不匹配返回None
re.search(pattern.string,flags=0)              扫描字符串寻找匹配，如果符合返回一个匹配对象并终止匹配,否则返回None
re.spile(pattern,string,maxsplit=0,flags=0)    以匹配模式作为分隔符，切分字符串为列表
re.findall(pattern,string,flags=0)             以列表形式返回所有匹配的字符串
re.finditer(pattern,string,flags=0)            以迭代器形式返回所有匹配的字符串
re.sub(pattern,repl,string,count=0,flags=0)    字符串替换，repl替换匹配的字符串，repl可以是一个函数
'''

#re.compile方法
'''
语法:re.compile(pattern, flags=0)
pattern 指的是正则表达式。flags是标志位的装饰符，用于控制表达式匹配模式
'''
#import re
#s = "this is test string"
#pattern = re.compile('this is')    #匹配this is
#result = pattern.match(s)
#print(result)


#re.match()方法 （最常用）
'''
语法: re.match(pattern,string,flags=0)
'''
#import re
#s = "this is test string"
#result = re.match('this', s)    #正则是从左到右匹配的
##print(result)
##print(result.group())
#if result:
#    print("匹配成功")
#    print(result.group())      #匹配成功才能用.group（s 列表有该字符串）
#else:
#    print("匹配失败")



# 代表字符
'''
字符                描述
.                  任意单个字符(除了\n)
[]                 匹配中括号的任意一个字符。并且特殊字符写在[]会被当成普通字符来匹配
[.-.]              匹配中括号中范围内的任意一个字符，例如[a-z],[0-9]
[^]                匹配[^字符]之外的任意一个字符
\d                 匹配数字，等效[0-9]
\D                 匹配非数字字符，等效[^0-9]
\s                 匹配单个空白字符(空格、Tab键)，等效[\t\n\r\f\v]
\S                 匹配空白字符之外的所有字符，等效[^\t\n\r\f\v]
\w                 匹配字母、数字、下划线，等效[a-zA-Z0-9_]
\W                 与\w相反，等效[^a-zA-Z0-9_]
'''

##########代表字符############
# . 匹配单个字符
'''
import re
s = "hello world"
# 一个点代表任意一个字符
result1 = re.match(".", s)
result2 = re.match("..", s)
result3 = re.match("...", s)
result4 = re.match("hell.", s)
print(result1)
print(result2)
print(result3)
print(result4)
# 打印结果
#<re.Match object; span=(0, 1), match='h'>
#<re.Match object; span=(0, 2), match='he'>
#<re.Match object; span=(0, 3), match='hel'>
#<re.Match object; span=(0, 5), match='hello'>
'''

# []中括号中任意一个字符
'''
import re    #导入re库
#s = "hello world"
#result = re.match("[h]", s)
#result1 = re.match("[llohe]", s)
#print(result)
#print(result1)
#
## [.-.]范围匹配
#result2 = re.match("h[hesll]", s)   #范围匹配
#print(result2)
#
## [^]取反
#result3 = re.match("h[^ahell]", s)
#print(result3)

# \d 匹配数字
n = "1204219 75633"
#resu = re.match('[0-9]', n)
resu = re.match('\d\d\d\d\d\d\d\s\d', n)    #多个\d匹配多个字符 \s是匹配空白字符
print(resu)

# \D 匹配非数字
n1 = "ahk124dagf23"
resu1 = re.match('[^0-9]', n1)
resu2 = re.match('\D\D\D\D\D', n1)
print(resu1)
print(resu2)

# \s  匹配单个空白字符(空格、Tab键)
# \S 匹配空白字符之外的所有字符
a = '120 21480 asf sakjf'
test = re.match('\d\d\d\s\d', n)
print(test)


# \w 匹配字母、数字、下划线
# \W 与\w相反
z = "aBc123"
test1 = re.match('[a-z][A-Z]', z)
test2 = re.match('[a-z][A-Z].\d\d\d', z)
#test2 = re.match('[a-z][A-Z].[0-9]', z)
test3 = re.match('\w\w\w\w\w\w', z)      #可以匹配任意一个字符
print(test1)
print(test2)
print(test3)
#匹配结果
#<re.Match object; span=(0, 2), match='aB'>
#<re.Match object; span=(0, 6), match='aBc123'>
#<re.Match object; span=(0, 6), match='aBc123'>
'''


######### 原始字符串符号 "r" ##########
'''
"r" 表示原始字符串，有了它，字符串里的特殊意义符号就会自动加转义符
示例:
s = "123\\abc"
result = re.macth(r"123\\abc", s)
print(result)
'''

#import re
#e = "123\\abc"
#name = re.match("123\\abc", e)     #结果匹配不到 \\ 是转义符
#name1 = re.match(r"123\\abc", e)   #加上 r 可以在字符串里的特殊字符自动加上转义符
##name1 = re.match("123\\\\abc", e)   #等同于 name1 = re.match(r"123\\abc", e)
#print(name)
#print(name1)



# 代表数量
'''
字符          描述
*            匹配前面的子表达式0次或多次（无限次）
+            匹配前面的子表达式1次或多次
?            匹配前面的子表达式0次或1次
{n}          匹配花括号前面字符n个字符
{n,}         匹配花括号前面字符至少n个字符
{n,m}        匹配花括号前面字符至少n个字符，最多m个字符
'''

####### 代表数量 ########
'''
import re
s = "hello world"
reslut = re.match("...........", s)
reslut1 = re.match(".*", s)     # .* 匹配0次到多次（前面必须有个内容 .是前面任意字符）
reslut2 = re.match("hel+o", s)  #匹配前一个字符一次或者多次
reslut3 = re.match("hel?o", s)   #匹配前一个字符一次，如果两次无效
reslut4 = re.match(".{8}", s)
reslut5 = re.match(".{2,9}", s)
print(reslut)
print(reslut1)
print(reslut2)
print(reslut3)
print(reslut4)
print(reslut5)

n = "a3138869723"
#aaa = re.match(".{11}", n)     # . 表示前面任意一个字符（不管数字还是字母都匹配到）
aaa = re.match("\d{11}", n)    # \d 表示前面必须是数字
if aaa:
    print("这是一个11位的手机号码")
else:
    print("这不是一个手机号")
'''



########## 代表边界 ############
'''
字符         描述
^           匹配以什么开头
$           匹配以什么结尾
\b          匹配单词边界
\B          匹配非单词边界
'''

# 示例：匹配用户输入的邮箱地址
# import re
#email = "fdd39969@163.com"
##mail = re.match(\w+@[0-9]+\.[a-z]+$)
#mail = re.match("^[a-z]+[0-9]+@[0-9]+\.[a-z]+$", email)     # +号 表示多个字符或者数字
#if mail:
#    print("输入的邮箱格式正确")
#    print(f"mail: %s" %mail)
#else:
#    print("输入的邮箱格式错误: 请重新输入！！")



########### 代表分组 ###########
'''
字符             描述
|               匹配竖杠两边的任意一个正则表达式
(re)            匹配小括号正则表达式。   使用\n反向引用，n是数字，从1开始编号，表示引用第n个分组匹配的内容。
(?P<name>re)    分组别名，name是表示分组名称
(?P=name)       引用分组别名
'''

# 示例：匹配用户输入的邮箱地址
import re
#email = "fdd39969@163.com"
#email1 = "2370046629@qq.com"
email1 = input("请输入你的邮箱地址: ").strip()          #.strip() 表示多个空格也没事
#mail = re.match(\w+@[0-9]+\.[a-z]+$)
#mail = re.match("^[a-z]+[0-9]+@[0-9]+\.[a-z]+$", email)     # +号 表示多个字符或者数字
mail1 = re.match("[0-9|a-z|A-Z]+@[163|126|qq]+\.[a-z]+$", email1)    # 限定运营商邮箱
if mail1:
    print("输入的邮箱格式正确")
    print(f"email: %s" %mail1.group())        # .group() 只获取邮箱信息
else:
    print("输入的邮箱格式错误: 请重新输入！！")